/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package View.planificacion;

import Algorithm.Algoritmo;
import Algorithm.EnvioPedidoAlg;
import DAO.EmpleadoDAO;
import DAO.ParametroDAO;
import Model.Empleado;
import Presenter.VehiculoPresenter;
import Model.Vehiculo;
import Model.Pedido;
import Model.Parametro;
import Model.Simulacion;
import Model.Turno;
import Presenter.EnvioPedidoPresenter;
import Presenter.PedidoPresenter;
import Presenter.SimulacionPresenter;
import Presenter.TurnoPresenter;
import Principals.Constantes;
import Principals.Utils;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Paola
 */
public class Frm_Simulacion extends javax.swing.JDesktopPane {

    private List<EnvioPedidoAlg> lstEnvioPedidos;
    private int TIEMPO_PROMETIDO = 24;
    private int numMotosOriginal;
    private int numAutosOriginal;
    private DefaultTableModel mdlOriginal;
    private DefaultTableModel mdlSimulacion;
    private List<Integer> lstIdVehiculosOrginales;
    private Boolean finSimulacion = false;
    private int iteraciones = 0;
    private int ATiempoOriginal =0;
    private int ATiempoSimulacion =0;
    /* ======== PARA BARRITA ======== */
    private int N ;
    private int contador ;
    private double cantidad;
    /* ======== FIN BARRITA ======== */
    /**
     * Creates new form Frm_ReporteHorasExtras
     */
    public Frm_Simulacion() {
        initComponents();
        cargarCantVehiculos();
        mdlOriginal = new DefaultTableModel();
        mdlSimulacion = new DefaultTableModel();
        EnvioPedidoPresenter.actualizarEnvioPedido();
    }

    public void cargarCantVehiculos() {
        List<Vehiculo> lstVehiculos;
        lstVehiculos = VehiculoPresenter.obtenerVehiculos();
        lstIdVehiculosOrginales = new ArrayList<Integer>();
        for (int i = 0; i < lstVehiculos.size(); i++) {
            lstIdVehiculosOrginales.add(lstVehiculos.get(i).getIdVehiculo());
            if (lstVehiculos.get(i).getTipoVehiculo().getValorString().equalsIgnoreCase(Constantes.NOMBRE_MOTO_BD)) {
                numMotosOriginal++;
            } else if (lstVehiculos.get(i).getTipoVehiculo().getValorString().equalsIgnoreCase(Constantes.NOMBRE_AUTO_BD)) {
                numAutosOriginal++;
            }
        }
        spnCantMotos.setValue(numMotosOriginal);
        spnCantAutos.setValue(numAutosOriginal);        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        pnlBuscarPedido = new javax.swing.JPanel();
        lblDesde = new javax.swing.JLabel();
        lblHasta = new javax.swing.JLabel();
        jdcDesde = new com.toedter.calendar.JDateChooser();
        jdcHasta = new com.toedter.calendar.JDateChooser();
        lblDesde1 = new javax.swing.JLabel();
        lblHasta1 = new javax.swing.JLabel();
        spnCantMotos = new javax.swing.JSpinner();
        spnCantAutos = new javax.swing.JSpinner();
        btnSimular = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        barrita = new javax.swing.JProgressBar();
        jScrollPane2 = new javax.swing.JScrollPane();
        tblOriginal = new javax.swing.JTable();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblSimulacion = new javax.swing.JTable();

        pnlBuscarPedido.setBorder(javax.swing.BorderFactory.createTitledBorder("Parámetros"));

        lblDesde.setText("Desde:");

        lblHasta.setText("Hasta:");

        lblDesde1.setText("Motos:");

        lblHasta1.setText("Autos:");

        btnSimular.setText("Generar Simulacion");
        btnSimular.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSimularActionPerformed(evt);
            }
        });

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel2.setText("Simulacion");

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel3.setText("Original");

        javax.swing.GroupLayout pnlBuscarPedidoLayout = new javax.swing.GroupLayout(pnlBuscarPedido);
        pnlBuscarPedido.setLayout(pnlBuscarPedidoLayout);
        pnlBuscarPedidoLayout.setHorizontalGroup(
            pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlBuscarPedidoLayout.createSequentialGroup()
                .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(pnlBuscarPedidoLayout.createSequentialGroup()
                        .addGap(98, 98, 98)
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(barrita, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(pnlBuscarPedidoLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lblDesde, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lblDesde1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 25, Short.MAX_VALUE)
                        .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jdcDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(spnCantMotos, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE)
                        .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(pnlBuscarPedidoLayout.createSequentialGroup()
                                .addComponent(lblHasta1)
                                .addGap(18, 18, 18)
                                .addComponent(spnCantAutos, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(pnlBuscarPedidoLayout.createSequentialGroup()
                                .addComponent(lblHasta)
                                .addGap(18, 18, 18)
                                .addComponent(jdcHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 27, Short.MAX_VALUE)
                .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnSimular, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(107, 107, 107))
        );
        pnlBuscarPedidoLayout.setVerticalGroup(
            pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pnlBuscarPedidoLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(pnlBuscarPedidoLayout.createSequentialGroup()
                        .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jdcDesde, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jdcHasta, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblDesde)
                            .addComponent(lblHasta))
                        .addGap(25, 25, 25)
                        .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblDesde1)
                            .addComponent(lblHasta1)
                            .addComponent(spnCantMotos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(spnCantAutos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(btnSimular, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(44, 44, 44)
                .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pnlBuscarPedidoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(jLabel2)
                        .addComponent(jLabel3))
                    .addComponent(barrita, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        tblOriginal.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Elemento", "Cantidad"
            }
        ));
        jScrollPane2.setViewportView(tblOriginal);

        tblSimulacion.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Elemento", "Cantidad"
            }
        ));
        jScrollPane1.setViewportView(tblSimulacion);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(pnlBuscarPedido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 366, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(25, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(pnlBuscarPedido, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btnSimularActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSimularActionPerformed
        Date fDesde = jdcDesde.getDate();
        Date fHasta = jdcHasta.getDate();
        int numMotos = (Integer) spnCantMotos.getValue();
        int numAutos = (Integer) spnCantAutos.getValue();
        if (fDesde == null || fHasta == null) {
            JOptionPane.showMessageDialog(this, "Ingrese ambas fechas");
            return;
        }
        if (!fDesde.before(fHasta)) {
            JOptionPane.showMessageDialog(this, "Corrija las fechas ingresadas");
            return;
        }
        if ((Integer) spnCantMotos.getValue() < numMotosOriginal) {
            JOptionPane.showMessageDialog(this, "Corrija la cantidad de Motos ingresadas");
            return;
        }
        if ((Integer) spnCantAutos.getValue() < numAutosOriginal) {
            JOptionPane.showMessageDialog(this, "Corrija la cantidad de Autos ingresadas");
            return;
        }

        mdlSimulacion.setNumRows(0);
        mdlOriginal.setNumRows(0);
  
        List<Pedido> lstPedidosPendientes = PedidoPresenter.buscarPedido("", "", "", "", Utils.formatDate(fDesde), Utils.formatDate(fHasta));
        contador = 0 ;
        N = 2 * lstPedidosPendientes.size() ;
        cantidad = 100.0 / (double)N ;
        
        CorrerOriginal(fDesde, fHasta, true);
        CorrerSimulacion(fDesde, fHasta, numMotos, numAutos);
        barrita.setValue( 100 ) ;
        Rectangle progress = barrita.getBounds() ;
        progress.x = 0 ;
        progress.y = 0 ;
        barrita.paintImmediately( progress ) ;
    }//GEN-LAST:event_btnSimularActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JProgressBar barrita;
    private javax.swing.JButton btnSimular;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private com.toedter.calendar.JDateChooser jdcDesde;
    private com.toedter.calendar.JDateChooser jdcHasta;
    private javax.swing.JLabel lblDesde;
    private javax.swing.JLabel lblDesde1;
    private javax.swing.JLabel lblHasta;
    private javax.swing.JLabel lblHasta1;
    private javax.swing.JPanel pnlBuscarPedido;
    private javax.swing.JSpinner spnCantAutos;
    private javax.swing.JSpinner spnCantMotos;
    private javax.swing.JTable tblOriginal;
    private javax.swing.JTable tblSimulacion;
    // End of variables declaration//GEN-END:variables

    private double CorrerOriginal(Date fdesde, Date fhasta, Boolean original) {
        //primero se cambia de estado a los pedidos que fueron entregados durante el periodo de simulacion
        List<Pedido> lstPedidosPendientes = PedidoPresenter.buscarPedido("", "", "", "", Utils.formatDate(fdesde), Utils.formatDate(fhasta));
        //System.out.println("Pedido totales: " + lstPedidosPendientes.size());
        //se ordenan por dias para planificar por dia//
        
        List<List<Pedido>> lstPedidosPorDia = new ArrayList();
        List<String> lstFechas = new ArrayList<String>();
        for (int i = 0; i < lstPedidosPendientes.size(); i++) {
            Pedido objPedido = lstPedidosPendientes.get(i);
            //se busca si ya se tiene registrada la fecha del pedido
            int indice = 0;
            Boolean encontrado = false;
            for (int j = 0; j < lstFechas.size(); j++) {
                if (lstFechas.get(j).equals(Utils.formatDate(objPedido.getFechaRegistro()))) {
                    indice = j;
                    encontrado = true;
                    break;
                }
            }
            //en el caso que ya este registrada la fecha del pedido, solo se agrega al la lista de pedidos de esa fecha
            if (encontrado) {
                lstPedidosPorDia.get(indice).add(objPedido);
            } else {
                List<Pedido> lstAux = new ArrayList<Pedido>();
                lstAux.add(objPedido);
                lstFechas.add(Utils.formatDate(objPedido.getFechaRegistro()));
                lstPedidosPorDia.add(lstAux);
            }
        }

        //ordenar por fecha <---------- TO DO
        int cantATiempo = 0;
        int cantADestiempo = 0;
        for (int i = 0; i < lstPedidosPorDia.size(); i++) {
            //System.out.println("Dia :" + lstFechas.get(i) + " con:" + lstPedidosPorDia.get(i).size() + " numero de pedidos");
            List<Pedido> lstPedidosdelDia = lstPedidosPorDia.get(i);
            for (int j = 0; j < lstPedidosdelDia.size(); j++) {
                lstPedidosdelDia.get(j).setEstado(0);
                PedidoPresenter.modificarPedido(lstPedidosdelDia.get(j));
                double value = contador++ * cantidad ;
                barrita.setValue( (int)value ) ;
                Rectangle progress = barrita.getBounds() ;
                progress.x = 0 ;
                progress.y = 0 ;
                barrita.paintImmediately( progress ) ;
            }

            Algoritmo objAlgoritmoGenetico = new Algoritmo();
            try {
                objAlgoritmoGenetico.load();
                List<Double> lstFitnessSolucion = new ArrayList<Double>();
                objAlgoritmoGenetico.EsSimulacion = true;
                lstEnvioPedidos = objAlgoritmoGenetico.Genetico(lstFitnessSolucion);
            } catch (Exception ex) {
                Logger.getLogger(Frm_PlanificarPedidos.class.getName()).log(Level.SEVERE, null, ex);
            }

            Date horaPrometida;
            Date horaLlegada;
            int minutosTrancurridos = 0;
            for (int k = 0; k < lstEnvioPedidos.size(); k++) {
                List<Pedido> lstPedidos = lstEnvioPedidos.get(k).getPedidos();
                for (int j = 0; j < lstPedidos.size(); j++) {
                    horaPrometida = Utils.addMinutesToDate(lstPedidos.get(j).getFechaRegistro(), TIEMPO_PROMETIDO * 60);
                    horaLlegada = lstEnvioPedidos.get(k).getFechaRegreso();
                    minutosTrancurridos = Utils.diffHourMinutes(horaLlegada, horaPrometida);
                    horaLlegada = Utils.addMinutesToDate(lstPedidos.get(j).getFechaRegistro(), minutosTrancurridos);
                    if (horaLlegada.before(horaPrometida)) {
                        cantATiempo++;
                    } else {
                        cantADestiempo++;
                    }
                }
            }
            //volver a restaurar el estado de los pedidos del dia i
            for (int j = 0; j < lstPedidosdelDia.size(); j++) {
                lstPedidosdelDia.get(j).setEstado(2);
                PedidoPresenter.modificarPedido(lstPedidosdelDia.get(j));
            }
        }
        if (original) {
            Object[] fila = new Object[2];
            mdlOriginal.setNumRows(0);
            mdlOriginal = (DefaultTableModel) tblOriginal.getModel();

            fila[0] = "Cantidad de Motos Usadas";
            fila[1] = numMotosOriginal;
            mdlOriginal.insertRow(0, fila);
            /////
            fila[0] = "Cantidad de Autos Usados";
            fila[1] = numAutosOriginal;
            mdlOriginal.insertRow(1, fila);
            /////
            fila[0] = "Total de Pedidos";
            fila[1] = cantATiempo+cantADestiempo;
            mdlOriginal.insertRow(2, fila);
            /////
            ATiempoOriginal = cantATiempo;
            fila[0] = "Cantidad de Pedidos a Tiempo";
            fila[1] = cantATiempo;
            mdlOriginal.insertRow(3, fila);
            /////
            fila[0] = "Cantidad de Pedidos a Destiempo";
            fila[1] = cantADestiempo;
            mdlOriginal.insertRow(4, fila);
            
            ATiempoOriginal = cantATiempo;
        } else {
            Object[] fila = new Object[2];
            mdlSimulacion.setNumRows(0);
            mdlSimulacion = (DefaultTableModel) tblSimulacion.getModel();

            fila[0] = "Cantidad de Motos Usadas";
            fila[1] = (Integer)spnCantMotos.getValue();
            mdlSimulacion.insertRow(0, fila);
            /////
            fila[0] = "Cantidad de Autos Usados";
            fila[1] = (Integer)spnCantAutos.getValue();
            mdlSimulacion.insertRow(1, fila);
            /////
            fila[0] = "Total de Pedidos";
            fila[1] = cantATiempo+cantADestiempo;
            mdlSimulacion.insertRow(2, fila);
            
            ATiempoSimulacion = cantATiempo;
            fila[0] = "Cantidad de Pedidos a Tiempo";
            fila[1] = cantATiempo;
            mdlSimulacion.insertRow(3, fila);
            /////
            fila[0] = "Cantidad de Pedidos a Destiempo";
            fila[1] = cantADestiempo;
            mdlSimulacion.insertRow(4, fila);
            
            
            String cadena = (ATiempoSimulacion*1.0/(cantADestiempo+cantATiempo))*100.0 - (ATiempoOriginal*1.0/(cantADestiempo+cantATiempo))*100.0 + "";
            int indice = cadena.indexOf(".");
            indice = indice + 2;
            cadena = cadena.substring(0, indice);
            ATiempoSimulacion = cantATiempo;
            /////
            fila[0] = "Porcentaje de Mejora";
            fila[1] = cadena + " %";
            mdlSimulacion.insertRow(5, fila);
            Simulacion objSimulacion = new Simulacion();
            objSimulacion.setFechaInicio(fdesde);
            objSimulacion.setFechaFin(fhasta);
            objSimulacion.setNumPedidos(cantATiempo+cantADestiempo);
            objSimulacion.setNumAutosInicio(numAutosOriginal);
            objSimulacion.setNumMotosInicio(numMotosOriginal);
            objSimulacion.setNumAutosSim((Integer)spnCantAutos.getValue());
            objSimulacion.setNumMotosSim((Integer)spnCantMotos.getValue());
            objSimulacion.setPedidoTiempoOriginal(ATiempoOriginal);
            objSimulacion.setPedidoTiempoSim(ATiempoSimulacion);
            objSimulacion.setMejora(cadena);
            SimulacionPresenter.registrarSimulacion(objSimulacion);
        }
        
        return ((ATiempoSimulacion/ATiempoOriginal -1)*100);
    }

    private void CorrerSimulacion(Date fdesde, Date fhasta, int numMotos, int numAutos) {
        //primero se cambia de estado a los pedidos que fueron entregados durante el periodo de simulacion

        System.out.println("SIMULACION:");
        List<Turno> lstTurno = TurnoPresenter.listTurno();
        List<Empleado> lstEmpleado = new ArrayList<Empleado>();
        Turno objTurno = new Turno();
        Boolean noEncontroTurno = true;
        for(int i=0; i<lstTurno.size()-1;i++){
            if(Utils.betweenDate(lstTurno.get(i).getHoraInicio(), lstTurno.get(i).getHoraFin(), new Date())){
                objTurno = lstTurno.get(i);
                noEncontroTurno =false;
                break;
            }
        }
        //en el caso que sea turno noche no entra en el if pues empieza a las 10 y termina a las 6 :/
        if(noEncontroTurno){
            objTurno = lstTurno.get(2);
        }
        //se setean la cantidad de vehiculos agregados
        List<Parametro> lsttipoVehiculos = ParametroDAO.getTipoVehiculos();
        Parametro tipoAuto = new Parametro();
        Parametro tipoMoto = new Parametro();
        for(int i=0; i<lsttipoVehiculos.size();i++){
            if(lsttipoVehiculos.get(i).getValorString().equals(Constantes.NOMBRE_AUTO_BD)){
                tipoAuto = lsttipoVehiculos.get(i);
            }else{
                tipoMoto = lsttipoVehiculos.get(i);
            }
        }
        
        for (int i = 0; i < numAutos - numAutosOriginal; i++) {           
            VehiculoPresenter.registrarVehiculo("A00000" + i,tipoAuto, 2013);
            //insertar conductores de motos
            Empleado objEmpleado = new Empleado();
            objEmpleado.setNombres("Simulacion" + i);
            objEmpleado.setApellidoMaterno("Simulacion" + i);
            objEmpleado.setApellidoPaterno("Simulacion" + i);
            objEmpleado.setDireccion("Direccion");
            objEmpleado.setTelefono("4619443999");
            objEmpleado.setCorreo("empleado@dp1.com");
            objEmpleado.setNroDocumento("14995704");
            objEmpleado.setTipoVehiculo(tipoAuto);
            objEmpleado.setEstado(1);
            objEmpleado.setNroBrevete("404496051");
            objEmpleado.setTurno(objTurno);
            objEmpleado = EmpleadoDAO.registrarEmpleadoSimulacion(objEmpleado);
            lstEmpleado.add(objEmpleado);
            
        }
        
        for (int i = 0; i < numMotos - numMotosOriginal; i++) {
            VehiculoPresenter.registrarVehiculo("M00000" + i, tipoMoto, 2013);
            //insertar conductores de autos
            Empleado objEmpleado = new Empleado();
            objEmpleado.setNombres("Empleado" + i);
            objEmpleado.setApellidoMaterno("ApMAterno" + i);
            objEmpleado.setApellidoPaterno("ApPaterno" + i);
            objEmpleado.setDireccion("Direccion");
            objEmpleado.setTelefono("4619443999");
            objEmpleado.setCorreo("empleado1@dp1.com");
            objEmpleado.setNroDocumento("14995704");
            objEmpleado.setTipoVehiculo(tipoMoto);
            objEmpleado.setEstado(1);
            objEmpleado.setNroBrevete("404496051");
            objEmpleado.setTurno(objTurno);
            EmpleadoDAO.registrarEmpleado(objEmpleado);
        }
        System.out.println("Autos extra: " + (numAutos - numAutosOriginal) + " Motos extra: " + (numMotos - numMotosOriginal));
        
        CorrerOriginal(fdesde, fhasta, false);
//        double mejora =0.0;
//        for(int i=1; i<10;i++){
//            mejora = CorrerOriginal(fdesde, fhasta, false);
//            if (mejora>15){
//                break;
//            }
//        }
        

        
        //eliminar vehiculos luego de simulacion
        //elimino aquellos que no tengan el id dentro de la lista de vehiculos orginales
        String lista ="(";
        for(int i=0; i<lstIdVehiculosOrginales.size();i++){
            if(i==lstIdVehiculosOrginales.size()-1){
                lista = lista + lstIdVehiculosOrginales.get(i) + ")";
            }else{
                lista = lista + lstIdVehiculosOrginales.get(i) + ",";
            }
            
        }
        List<Vehiculo> lstVehiculosNuevos = VehiculoPresenter.buscarVehiculosSimulacion(lista);
        for(int i=0; i<lstVehiculosNuevos.size(); i++){
            VehiculoPresenter.eliminarVehiculo(lstVehiculosNuevos.get(i));
        }
        
        //eliminar los empleados registrados para la simulacion
        for(int i=0; i<lstEmpleado.size();i++){
            Empleado objEmpleado = lstEmpleado.get(i);
            objEmpleado.setEstado(0);
            EmpleadoDAO.modificarEmpleado(objEmpleado);
        }
        
        finSimulacion = true;   
        limpiar();
    }
    
    public void limpiar(){
        spnCantMotos.setValue(numMotosOriginal);
        spnCantAutos.setValue(numAutosOriginal);
        

           
    }
    
    
   
   
}

